/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.losalpes.marketplace.pical.beans;

import co.com.losalpes.marketplace.pical.bos.CalificacionBO;
import co.com.losalpes.marketplace.pical.entities.Calificacion;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Diego
 */
@Stateful
public class PICALBeanTest implements PICALBeanRemote, PICALBeanLocal {

    // "Insert Code > Add Business Method")
    @PersistenceContext
    private EntityManager em;

    /**
     * Se establece el estado de la calificacion en PENDIENTE
     *
     * @param cotizacionBO sin el numero
     * @return numero de la cotizacion
     */
    public String crearCalificacion(CalificacionBO calificacionBO) {
        String numero = "CAL" + System.currentTimeMillis();
        calificacionBO.setNumero(numero);
        calificacionBO.setEstado(Calificacion.E_PENDIENTE);
        Calificacion calificacion = new Calificacion(calificacionBO);
        em.persist(calificacion);
        return numero;
    }

    /**
     * Guarda una calificacion de un fabricante hacia un comercio *
     * @param calificacionBO
     * @return
     */
    public boolean calificarFabricanteAComercio(CalificacionBO calificacionBO) {
        Calificacion calificacion = em.find(Calificacion.class, calificacionBO.getNumero());
        
        if (calificacion != null) {
            calificacion.setCal_comercio(calificacionBO.getCal_comercio());
            calificacion.setCom_comercio(calificacionBO.getCom_comercio());
            calificacion.setEstado(validarEstadoCalificacion(calificacion));
            em.merge(calificacion);
            return true;
        }
        return false;
    }

    /**
     * Guarda una calificacion de un comercio hacia un producto y el fabricante
     * ambas al tiempo
     *
     * @param calificacionBO
     * @return
     */
    public boolean calificarComercioAProductoYFabricante(CalificacionBO calificacionBO) {
        Calificacion calificacion = em.find(Calificacion.class, calificacionBO.getNumero());
        if (calificacion != null) {
            calificacion.setCal_producto(calificacionBO.getCal_producto());
            calificacion.setCom_producto(calificacionBO.getCom_producto());
            calificacion.setCal_fabricante(calificacionBO.getCal_fabricante());
            calificacion.setCom_fabricante(calificacionBO.getCom_fabricante());
            calificacion.setEstado(validarEstadoCalificacion(calificacion));
            em.merge(calificacion);
            return true;
        }
        return false;
    }

    /**
     * Obtiene las calificaciones a realizar por un comercio o fabricante
     *
     * @param estado por defecto pendiente
     * @param nit del faricante o compercio
     * @return listado de calificaciones que puede realizar
     */
    public List<CalificacionBO> obtenerCalificacionesComercio(String estado, String nit) {
        Query q = em.createNamedQuery("getCalificacionesByestadoNitComercio");
        q.setParameter("estado", estado);
        q.setParameter("nit", nit);

        List<CalificacionBO> calificaciones = new ArrayList<CalificacionBO>(0);
      
        if(q.getResultList() != null && !q.getResultList().isEmpty()){
            calificaciones = q.getResultList();
        }

        return calificaciones;
    }
    
     /**
     * Obtiene las calificaciones a realizar por un fabricante
     *
     * @param estado por defecto pendiente
     * @param nit del faricante o compercio
     * @return listado de calificaciones que puede realizar
     */
    public List<CalificacionBO> obtenerCalificacionesFabricante(String estado, String nit) {
        Query q = em.createNamedQuery("getCalificacionesByestadoNitFabricante");
        q.setParameter("estado", estado);
        q.setParameter("nit", nit);

        List<CalificacionBO> calificaciones = new ArrayList<CalificacionBO>(0);
      
        if(q.getResultList() != null && !q.getResultList().isEmpty()){
            calificaciones = q.getResultList();
        }

        return calificaciones;
    }

    /**
     * Valida el estado de una calificacion;
     *
     * @param cal
     * @return
     */
    private String validarEstadoCalificacion(Calificacion cal) {
        
        if (cal.getCom_comercio() != null && cal.getCom_fabricante() != null && cal.getCom_producto() != null) {
            return Calificacion.E_TERMINADA;
        } else {
            return Calificacion.E_PENDIENTE;
        }
    }
}
